﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Windows.Navigation;
using System.Windows.Media.Effects;
using System.Windows.Media.Animation;
using System.Data;
using produccion.forms;
using produccion.clases;
using produccion;
using System.IO;
using System.Diagnostics;
using System.Collections.ObjectModel;
using produccion.vistamodelo;


namespace produccion
{
    /// <summary>
    /// Lógica de interacción para Window1.xaml
    /// </summary>
    public partial class FRMBuscarCol : Window
    {
        public Boolean EsReferencia;
        public Boolean RequiereColor;
        public Boolean RequiereTalla = false;
        public string strValor = "";
        public string Retorno;
        public Boolean logNuevo = true;

        public DataTable dtReferencia = new DataTable();
        public DataTable dtRetorno = new DataTable();
        DataTable dtC = new DataTable();

        CLSMAEREF MaeRef=new CLSMAEREF();
        CLSMAECOL MaeCol = new CLSMAECOL();
        CLSMAEPRO MaePro = new CLSMAEPRO();
        CLSMAEREFP MaeRefP = new CLSMAEREFP();
        CLSMAEMAT MaeMat = new CLSMAEMAT();
        CLSMAEMTP MaeMtp = new CLSMAEMTP();

        public FRMBuscarCol()
        {

            InitializeComponent();
            dtRetorno.Columns.Add(new DataColumn("Codigo", System.Type.GetType("System.String")));

        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            if (EsReferencia)
            {

            }
            if (!RequiereColor)
            {
                dgCol.Visibility = Visibility.Hidden;
            }
            buscarColor.Instance.EsReferencia = EsReferencia;
            buscarColor.Instance.RequiereColor = RequiereColor;
            buscarColor.Instance.liscolores.Clear();
            txtNombre.Focus();
        }

        private void txtNombre_TextChanged(object sender, TextChangedEventArgs e)
        {
            try
            {
                if (txtNombre.Text.Trim().Length == 0)
                {
                    dgRef.ItemsSource = null;
                    logNuevo = true;
                }

                if (logNuevo == true && txtNombre.Text.Trim().Length > 0)
                {
                    if (EsReferencia)
                    {
                        if (txtNombre.Text.Length.Equals(0))
                        {
                            dgRef.ItemsSource = "";
                            return;
                        }
                        MaeRef.NOMREF_REF = txtNombre.Text;
                        dgRef.ItemsSource = MaeRef.Buscar().DefaultView;
                    }
                    else
                    {
                        if (txtNombre.Text.Length.Equals(0))
                        {
                            dgRef.ItemsSource = "";
                            return;
                        }
                        MaeMat.NOMMAT_MAT = txtNombre.Text;
                        dtReferencia = MaeMat.Buscar();
                        dgRef.ItemsSource = dtReferencia.DefaultView;
                        //dgRef.ItemsSource = MaeMat.Buscar().DefaultView;
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error al buscar referencias", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }

        private void dgRef_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            try
            {
                logNuevo = false;
                if (EsReferencia)
                {
                    MaePro.CODREF_PRO = ((DataRowView)dgRef.Items[dgRef.SelectedIndex]).Row["Codigo"].ToString();
                    MaeRefP.CODREF_REF = MaePro.CODREF_PRO;

                    buscarColor.Instance.visorFotoReferencia.strCodigo = ((DataRowView)dgRef.Items[dgRef.SelectedIndex]).Row["Codigo"].ToString(); ;

                    if (RequiereColor & dgRef.SelectedIndex > -1)
                    {
                        MaeRefP.Consultar();
                        dtC=MaePro.BuscarColor();
                        buscarColor.Instance.liscolores.Clear();

                        foreach (DataRow dr in dtC.Rows)
                        {
                            buscarColor.Instance.liscolores.Add(new buscarColor.colores 
                            { 
                                codigo = dr["CODIGO"].ToString(),
                                nombre = dr["NOMBRE"].ToString(),
                                existencia = Convert.ToDouble(dr["EXISTENCIA"]),
                                incluido = false
                            });
                        }

                        txtInfo.Text = "" + (char)13 + "Material: " + MaeRefP.MATERIAL_REF + (char)13 + "Forro: " + MaeRefP.FORRO_REF + (char)13 + "Suela: " + MaeRefP.SUELA_REF;
                    }
                }
                else
                {
                    if (dgRef.SelectedIndex > -1)
                    {
                        MaeMtp.CODMAT_MTP = ((DataRowView)dgRef.Items[dgRef.SelectedIndex]).Row["Codigo"].ToString();

                        if (RequiereColor && dgRef.SelectedIndex > -1)
                        {
                            dtC = MaeMtp.BuscarColores();
                            buscarColor.Instance.liscolores.Clear();

                            foreach (DataRow dr in dtC.Rows)
                            {
                                buscarColor.Instance.liscolores.Add(new buscarColor.colores
                                {
                                    codigo = dr["CODIGO"].ToString(),
                                    nombre = dr["NOMBRE"].ToString(),
                                    existencia = Convert.ToDouble(dr["EXISTENCIA"]),
                                    incluido = false
                                });
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error al buscar colores", MessageBoxButton.OK, MessageBoxImage.Error);
            }

        }

        private void dgRef_MouseDoubleClick(object sender, MouseButtonEventArgs e)
        {
            try
            {
                Retorno = "";
                dtRetorno.Clear();

                if (dgRef.SelectedIndex > -1 && !RequiereColor)
                {
                    if (buscarColor.Instance.EsReferencia)
                        Retorno = ((DataRowView)dgRef.Items[dgRef.SelectedIndex]).Row["Codigo"].ToString();
                    else
                        Retorno = ((DataRowView)dgRef.Items[dgRef.SelectedIndex]).Row["Codigo"].ToString() + "-" + ((DataRowView)dgRef.Items[dgRef.SelectedIndex]).Row[1].ToString();

                    this.Close();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }

      
        private void dgCol_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            try
            {
                int j = dgCol.CurrentCell.Column.DisplayIndex;
                if (j != -1)
                {
                    if (j == 2)
                    {
                        dgCol.IsReadOnly = false;
                    }
                    else
                    {
                        dgCol.IsReadOnly = true;
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        private void btnAceptar_Click(object sender, RoutedEventArgs e)
        {
            Retorno = "";
            dtRetorno.Clear();

            if (RequiereColor==true)
            {
                int Contador = buscarColor.Instance.liscolores.Where(x => x.incluido.Equals(true)).Count();
                
                if (Contador == 0)
                {
                    this.Close();
                    return;
                }
                
                if (Contador == 1)
                {
                    List<buscarColor.colores> all = (from col in buscarColor.Instance.liscolores where col.incluido.Equals(true) select col).ToList();
                    foreach (buscarColor.colores c in all)
                    {
                        if (EsReferencia)
                            Retorno = ((DataRowView)dgRef.Items[dgRef.SelectedIndex]).Row["Codigo"].ToString() + c.codigo.ToString().Trim();
                        else
                            Retorno = ((DataRowView)dgRef.Items[dgRef.SelectedIndex]).Row["Codigo"].ToString() + c.codigo.ToString().Trim()  + "-" + ((DataRowView)dgRef.Items[dgRef.SelectedIndex]).Row[1].ToString();
                    }
                }

                if (Contador > 1)
                {
                    List<buscarColor.colores> all = (from col in buscarColor.Instance.liscolores where col.incluido.Equals(true) select col).ToList();
                    foreach (buscarColor.colores c in all)
                    {
                        DataRow drr = dtRetorno.NewRow();
                        drr["Codigo"] = ((DataRowView)dgRef.Items[dgRef.SelectedIndex]).Row["Codigo"].ToString() + c.codigo.ToString().Trim();
                        dtRetorno.Rows.Add(drr);
                    }
                }
            }
            else
            {
                if (dgRef.SelectedIndex != -1)
                {
                    Retorno = ((DataRowView)dgRef.Items[dgRef.SelectedIndex]).Row["Codigo"].ToString() + "-" + ((DataRowView)dgRef.Items[dgRef.SelectedIndex]).Row[1].ToString();
                }
                else
                {
                    this.Close();
                    return;
                }
            }
            this.Close();
        }

        private void dgRef_PreviewKeyDown(object sender, KeyEventArgs e)
        {
            var elemento = e.OriginalSource as UIElement;
            if (e.Key == Key.Enter && elemento != null)
            {
                e.Handled = true;
                elemento.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
            }
            if (e.Key == Key.F3 && elemento != null)
            {
                if (MDOgeneral.logBusquedadAbierta == true) { MDOgeneral.logBusquedadAbierta = false; }
            }

            if (e.Key == Key.F4 && elemento != null)
            {
                if (MDOgeneral.logBusquedadAbierta1 == true) { MDOgeneral.logBusquedadAbierta1 = false; }
            }

            if (e.Key == Key.F5 && elemento != null)
            {
                if (MDOgeneral.logBusquedadAbierta2 == true) { MDOgeneral.logBusquedadAbierta2 = false; }
            }
        }

        //
        // SINGLE CLICK EDITING
        //
        private void DataGridCell_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            DataGridCell cell = sender as DataGridCell;
            if (cell != null && !cell.IsEditing && !cell.IsReadOnly)
            {
                if (!cell.IsFocused)
                {
                    cell.Focus();
                }
                DataGrid dataGrid = FindVisualParent<DataGrid>(cell);
                if (dataGrid != null)
                {
                    if (dataGrid.SelectionUnit != DataGridSelectionUnit.FullRow)
                    {
                        if (!cell.IsSelected)
                            cell.IsSelected = true;
                    }
                    else
                    {
                        DataGridRow row = FindVisualParent<DataGridRow>(cell);
                        if (row != null && !row.IsSelected)
                        {
                            row.IsSelected = true;
                        }
                    }
                }
            }
        }

        static T FindVisualParent<T>(UIElement element) where T : UIElement
        {
            UIElement parent = element;
            while (parent != null)
            {
                T correctlyTyped = parent as T;
                if (correctlyTyped != null)
                {
                    return correctlyTyped;
                }

                parent = VisualTreeHelper.GetParent(parent) as UIElement;
            }
            return null;
        }

        private void dgCol_MouseDown(object sender, MouseButtonEventArgs e)
        {
            List<buscarColor.colores> all = (from col in buscarColor.Instance.liscolores where col.incluido.Equals(true) select col).ToList();
            foreach (buscarColor.colores c in all)
            {
               buscarColor.Instance.visorFotoReferencia.strColor = c.codigo.ToString().Trim();
            }
        }

        private void dgRef_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
        {
            DataGridBoundColumn c = (DataGridBoundColumn)e.Column;
            c.Binding = new Binding(e.PropertyName) { UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged };

            //c.IsReadOnly=String.IsNullOrEmpty(_ordenprodauto.lisPedTalla.Rows[0][c.Header.ToString()].ToString());

            if (e.Column.Header.ToString() == "CODIGO")
            {
                (e.Column as DataGridTextColumn).Width = 100;
            }

            if (e.Column.Header.ToString() == "NOMBRE")
            {
                (e.Column as DataGridTextColumn).Width = 280;
            }
        }

        private void Window_KeyDown(object sender, KeyEventArgs e)
        {
            var elemento = e.OriginalSource as UIElement;
            if (e.Key == Key.F3 && elemento != null)
            {
                if (e.Key == Key.F3)
                {
                    if (MDOgeneral.logBusquedadAbierta == true) { MDOgeneral.logBusquedadAbierta = false; }
                }
            }
        }

    }

    public class buscarColor:ObservableObject
    {
        # region singleton
        private static buscarColor instance = null;
        
        protected buscarColor()
        {
            logTodos = false;
            MDOgeneral.conectar();
            strTituloVentana = "Buscar referencia o materia prima" + " - Usuario:" + MDOgeneral.usuario + "-[FRMBuscarCol]";
            liscolores.Clear();
            strCodigo = "";
            visorFotoReferencia.strCodigo = "";
            visorFotoReferencia.strColor = "";
            RaisePropertyChangedEvent("visorFotoReferencia");
        }

        public static buscarColor Instance
        {
            get
            {
                if (instance == null)
                    instance = new buscarColor();

                return instance;
            }
            set
            {
                if (instance != null)
                    instance = null;
            }
        }

        #endregion

        #region Propiedades

        
        private string _strTituloVentana;
        public string strTituloVentana
        {
            get { return _strTituloVentana; }
            set { _strTituloVentana = value; RaisePropertyChangedEvent("strTituloVentana"); }
        }

        private Boolean _EsReferencia;
        public Boolean EsReferencia
        {
            get { return _EsReferencia; }
            set { _EsReferencia = value; RaisePropertyChangedEvent("EsReferencia"); }
        }

        private Boolean _RequiereColor;
        public Boolean RequiereColor
        {
            get { return _RequiereColor; }
            set { _RequiereColor = value; RaisePropertyChangedEvent("RequiereColor"); }
        }

        private Boolean _logTodos = true;
        public Boolean logTodos
        {
            get { return _logTodos; }
            set
            {
                _logTodos = value;
                if (_logTodos)
                {
                    selTodoslosColores();
                }
                else
                {
                    selNingunColor();
                }
                RaisePropertyChangedEvent("logTodos");
            }
        }

        private string _strCodigo;
        public string strCodigo
        {
            get { return _strCodigo; }
            set { _strCodigo = value;  RaisePropertyChangedEvent("strCodigo"); }
        }

        private string _strNombre="";
        public string strNombre
        {
            get { return _strNombre; }
            set 
            { 
                _strNombre = value; 
                RaisePropertyChangedEvent("strNombre");
                if (value.Length == 1)
                {
                    if (visorFotoReferencia != null)
                    {
                        visorFotoReferencia.strCodigo = "";
                        visorFotoReferencia.strColor = "";
                        RaisePropertyChangedEvent("visorFotoReferencia");
                    }
                }
                if (value.Length == 0) 
                    liscolores.Clear();
            }
        }

        private ObservableCollection<colores> _liscolores = new ObservableCollection<colores>();
        public ObservableCollection<colores> liscolores 
        {
            get { return _liscolores; }
            set { _liscolores = value; RaisePropertyChangedEvent("liscolores"); }
        }

        private VMvisorFotoReferencia _visorFotoReferencia = new VMvisorFotoReferencia();
        public VMvisorFotoReferencia visorFotoReferencia
        {
            get { return _visorFotoReferencia; }
            set { _visorFotoReferencia = value; base.OnPropertyChanged("visorFotoReferencia"); }
        }
        #endregion

        #region Metodos
        private void selTodoslosColores()
        {
            foreach (colores col in liscolores)
            {
                col.incluido = true;
            }
        }

        private void selNingunColor()
        {
            foreach (colores col in liscolores)
            {
                col.incluido = false;
            }
        }
        #endregion


        public class colores : ObservableObject
        {
            private string _codigo;
            public string codigo
            {
                get { return _codigo; }
                set { _codigo = value; RaisePropertyChangedEvent("codigo"); }
            }

            private string _nombre;
            public string nombre
            {
                get { return _nombre; }
                set { _nombre = value; RaisePropertyChangedEvent("nombre"); }
            }

            private Double _existencia;
            public Double existencia
            {
                get { return _existencia; }
                set { _existencia = value; RaisePropertyChangedEvent("existencia"); }
            }

            private Boolean _incluido;
            public Boolean incluido
            {
                get { return _incluido; }
                set {  _incluido = value; RaisePropertyChangedEvent("incluido");  }
            }
        }

    }
}
